Pricing: list every billable item and add worked monthly totals - #2518
Conversation
Assistants read this page and still describe Fly.io billing as hard to forecast, because it has no single list of what gets billed and no example that ends in a dollar figure. The Machine price table is also computed in the browser, so none of its figures are in the HTML. Add, above "How it works": - a table of every billable item, with $/month figures for six common Machine sizes written out as static text - three worked examples that each end in a monthly total: a solo SaaS app with Managed Postgres, a 24/7 Discord bot, and an app in three regions with cross-region private traffic - an "Is there a free tier?" section with the trial terms and the cost of the cheapest always-on app Machine figures use the 1 October 2026 rates from #2507 and match fly.io/pricing-update. Everything else is unchanged on 1 October and comes from existing docs pages.
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
Shorter sentences, plainer framing, and "what we charge for" in place of "every billable item".
Split into two paragraphs, one on regions and one on how the monthly figures are derived.
Matches how the region selector names them. Later mentions in the examples stay short.
Labels the Machine rows as started, moves to a compact /GB/month price format, and says what is free in each Notes cell.
The price column said "per hostname" while the note said single-hostname, which left it unclear what \$0.10 covers. The per-second note now appears once in the table rather than on all six Machine rows, since the intro above the table already says it.
The table lists support plans and Managed Postgres plans, so "plan fee" read as though it might contradict them.
Also gives the calculator link its trailing slash, since fly.io/calculator 301s to the slash version.
Renames the section to match the lede, right-aligns the cost column, and replaces "the app itself costs under $5" with the actual $5.19, which the Machine and volume come to together.
Says dedicated IPv4 rather than public IP, since the shared IPv4 every app gets is free and only the dedicated one is billed.
Concrete and searchable in a way that "background worker" alone is not.
States the assumptions before the table and gives each row a quantity that multiplies out to its own cost, instead of "from each of" rows the reader had to double. Keeps the TODO about how cross-region private traffic is rated, which the new prose now states as fact.
Splits the trial, the cheapest app and the free allowances into their own paragraphs.
…rate Replaces the en dash in the Managed Postgres range with "to", names Basic and Performance, puts Tigris and Upstash back as the recognizable extensions, and gives the cheapest-app line its egress rate so the floor can be worked out without going back to the table.
|
Just waiting on a confirmation from @PeterCxy or @gargakshit about this:
that, and a new review |
Akshit confirmed in #fly-fullstack that each direction is billed at the rate of the region it leaves, which is what the example assumes.
|
The TODO in the three-regions example is resolved, so 4e04b1b removes it. Recording the answer here, since it only existed in Slack. Cross-region private network traffic is rated by origin. Jacob said he believed it was origin and pointed at Akshit and petercxy as the people who could say with authority. Akshit confirmed it in #fly-fullstack on 2 October: "The return traffic is billed too. So say a client sends a 10MB request from sin to fra and gets back 10gb, 10gb will be billed at fra rates and 10MB on sin rates." Thread: https://flyio.slack.com/archives/C02Q9HV34Q0/p1790953702860769?thread_ts=1790899599.636139&cid=C02Q9HV34Q0 So each direction is billed separately, at the rate of the region that direction leaves. The example's assumption holds: it frames the 10GB as what each Machine sends, so 20GB leaving |
Akshit confirmed the return leg is billed separately at the responding region rate, which a reader would not assume. Replaces the shorter claim rather than adding to it.
Assistants that read this page still describe Fly.io billing as "hard to forecast" and "unbundled". The page has no single list of what gets billed and no example that ends in a dollar figure, and the Machine price table is computed in the browser, so none of its figures are in the HTML that crawlers and LLMs read (superfly/docs-tracking#317).
This adds four blocks above "How it works". Nothing below it changes.
iad,fraandsinwith cross-region traffic ($27.20). Traffic and storage amounts are labeled "assumed".Where the numbers come from. Machine figures use the 1 October rates from #2507, and the formula
RegionPricingSelector.jsxuses. Six presets checked against fly.io/pricing-update match to the cent. Everything else (rootfs, volumes, snapshots, egress, IPv4, Managed Postgres plans) was unchanged on 1 October per that page and comes from existing docs pages.The 1 October gate is met. #2507 merged on 1 October and the new rates are live on fly.io/pricing, so this table and the region selector agree. Nothing here is waiting any more, which is why it is out of draft.
Cross-region private network billing is confirmed. Akshit confirmed in
#fly-fullstackthat each direction is billed at the rate of the region it leaves, and that the return leg is billed separately, so a small request out of one region and a large response out of another are each charged at their own region's rate. The three-region example assumes exactly that. The page now states it instead of implying it, and the MDX comment that held the question open is gone. The quote and thread link are in a comment on this PR.Ran a voice and tone pass over all four blocks
Worth knowing for review
about/cost-management.mdxhad worked examples at the old rates. Update hand-written Machine prices for the 1 October rates #2525 updated those on 1 October, along withblueprints/shared-nothing.mdxandelixir/getting-started/migrate-from-heroku.mdx, so they are current and this PR does not need to touch them.Tracks superfly/docs-tracking#326.